/**
  ******************************************************************************
  * COPYRIGHT(C) USTC-ROBOWALKER
  * @file    AHRS.h
  * @author  Glorill 1615688664@qq.com
  * @brief   结合加速度计、陀螺仪、磁力计，算出欧拉角
  * @date    2021-11-5
  * @version 1.0
  *
  ==============================================================================
                            How to use this library
  ==============================================================================
    @note
        需要PID.cpp
        配置SPI、一个外部中断用于通信
        配置一路PWM用于温度控制
        包含#include "AHRS.h"
        使用AHRS实例的接口函数
    @note
        调用AHRS.Init();初始化
        初始化函数很快几乎不会阻塞
    @note
        每1ms调用AHRS.Process();
        这里会依次完成加热恒温、陀螺仪校准
        完成后将：AHRS.GetState()==AHRS.NORMAL
        并进入正常工作状态     

  ******************************************************************************
  */

#ifndef __AHRS_H__
#define __AHRS_H__

class C_AHRS
{
    private:
        /*欧拉角 单位 rad
        右手螺旋定义正负
        0 yaw     上为正
        1 pitch   右为正
        2 roll      前为正*/
        float INS_Angle[3];

        float INS_gyro[3];
        float INS_accel[3];
        float INS_mag[3];
        float INS_quat[4]; //四元数
    
    public:
        enum E_AHRS_State
        {
            INITIALIZING = 0,   //初始化
            WARMING = 1,          //加热升温
            GYRO_CALIBRATION = 2, //陀螺仪校准
            NORMAL = 3            //正常
        };
        void Init(void);
        void Process(void);

        E_AHRS_State GetState() { return State; };
        void SetState(E_AHRS_State _State) { State = _State; };

        float GetTemperature() { return Temperature; };

        float GetYaw();
        float GetPitch();
        float GetRoll();
        const float *GetAccel();
        const float *GetGyro();
        const float *GetMag();
        const float *GetEulerAngle();
        const float *GetQuat();

    private:
        E_AHRS_State State;
        float Temperature;
};

extern C_AHRS AHRS;

#endif
